import os
import requests
import json

def solve_math_problem(problem_content: str, model: str = "deepseek-chat", temperature: float = 0.1) -> str:
    """
    功能：调用DeepSeek V3解决数学问题，要求分步骤计算并中文解释，返回结构化结果
    参数：
        problem_content: 数学题目的中文描述（如小明苹果问题）
        model: 调用的模型名称（默认deepseek-chat）
        temperature: 随机性参数（默认0.1，低随机性确保计算严谨）
    返回：
        成功：格式化后的解题步骤与结果
        失败：对应的错误提示信息
    """
    # 1. 安全读取API密钥（避免硬编码泄露，需提前配置环境变量）
    api_key = os.getenv("DEEPSEEK_API_KEY")
    if not api_key:
        return "❌ 错误：未检测到DEEPSEEK_API_KEY环境变量\n请先配置密钥：\n- Windows：CMD中执行 set DEEPSEEK_API_KEY=\"你的密钥\"\n- Mac/Linux：终端中执行 export DEEPSEEK_API_KEY=\"你的密钥\""

    # 2. 强化Prompt约束（确保模型严格分步骤、含计算式，避免输出混乱）
    enhanced_prompt = f"""
请解决以下数学问题，要求：
1. 必须分「初始状态→每步变化→最终结果」的逻辑步骤，每步都包含「中文解释+计算式」
2. 计算式用「数字符号」明确表达（如 5-2=3，而非“五个减两个等于三个”）
3. 最终用「答案：XXX」总结剩余数量，语言简洁易懂，适合小学生理解

数学问题：{problem_content}
"""

    try:
        # 3. 调用DeepSeek API（设置超时保护，避免长时间阻塞）
        url = "https://api.deepseek.com/v1/chat/completions"
        headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        }
        data = {
            "model": model,
            "messages": [{"role": "user", "content": enhanced_prompt.strip()}],
            "temperature": temperature,
            "max_tokens": 300,  # 控制长度（数学题解题步骤无需过长）
            "stream": False
        }
        
        response = requests.post(url, headers=headers, json=data, timeout=15)
        response.raise_for_status()  # 如果状态码不是200会抛出异常
        
        response_data = response.json()
        raw_solution = response_data["choices"][0]["message"]["content"].strip()
        formatted_result = f"""
📝 数学题解题结果
=============================
【题目】{problem_content}
【解题步骤】
{raw_solution}
=============================
💡 提示：若步骤不清晰或计算有误，可重新调用函数（建议保持temperature≤0.2，确保严谨性）
"""
        return formatted_result

    # 5. 捕获各类异常，返回明确可排查的提示
    except requests.exceptions.HTTPError as e:
        if e.response.status_code == 401:
            return "❌ 认证失败：API密钥错误、过期或无权限\n请检查密钥是否正确，或在DeepSeek官网确认账号状态"
        elif e.response.status_code == 400:
            return f"❌ 请求参数错误：{str(e)}\n可能原因：模型名称错误、输入文本过长或格式不正确"
        elif e.response.status_code == 429:
            return "❌ 请求频率限制：API调用次数超限\n建议：等待一段时间后重新尝试"
        else:
            return f"❌ HTTP错误：{e.response.status_code} - {str(e)}"
    except requests.exceptions.Timeout:
        return "❌ 请求超时：网络不稳定或API服务繁忙\n建议：检查网络连接，1分钟后重新尝试"
    except requests.exceptions.ConnectionError:
        return "❌ 连接错误：无法连接到DeepSeek API服务器\n建议：检查网络连接或防火墙设置"
    except json.JSONDecodeError:
        return "❌ 响应解析错误：API返回了非JSON格式的响应\n建议：检查API服务状态"
    except KeyError as e:
        return f"❌ 响应格式错误：缺少预期的字段 {str(e)}\n建议：检查API版本或联系技术支持"
    except Exception as e:
        return f"❌ 未知错误：{str(e)}\n建议：检查网络连接，或尝试更换模型"

# ------------------- 示例调用：解决小明苹果问题 -------------------
if __name__ == "__main__":
    # 定义数学问题（可直接替换为其他题目，如"小红有8支笔，借给同学3支，又买了5支，现在有多少支？"）
    apple_problem = """
小明有5个苹果，吃了2个，妈妈又给他3个，
然后他分给朋友一半，还剩多少苹果？
分步骤计算并用中文解释。
"""

    # 调用函数并打印结果
    solution = solve_math_problem(problem_content=apple_problem)
    print(solution)